package pro.syj.db;

import java.sql.Connection;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/*
 * 设定一个框架： 
 * 能够完成数据库的读和写的操作： 
 * select * from tableName where id=? and username=?
 * 定义读的方法; query(String sql, Object[] params );   
 * 
 * 写操作： 
 * delete from tableName where id=? 
 * update tableName set name=? , password=? where id=?
 * insert into tableName values(?,?,?); 
 * 定义写的方法： update(String sql , Object [] params ); 
 * 
 * 总结： 删除， 修改， 插入， 都属于数据库的写操作： 只有sql 语句不同，
 * 通过动态的传递sql 语句，   sql 语句里面的占位符的个数不确定， 所以
 * 可变参数的数据来传递。 
 * 
 */
@SuppressWarnings("unused")
public class DBassist {

	/*
	 * 封装3：增删改
	 * param1：sql语句
	 * param2：可变长参数序列 
	 * 返回是否成功
	 */
	public int update(String sql, Object ... params) throws Exception{
		//获得链接对象; 
		Connection connection = DB.getConnection();
		
		//stmt容器： 
		PreparedStatement pstmt = connection.prepareStatement(sql);
		
		//设置sql 语句当中的占位符号： 
		
		//获取stmt容器的元数据： 
		ParameterMetaData pmd = pstmt.getParameterMetaData();
		
		//获得？的个数： 
		int count = pmd.getParameterCount();
		
		//循环遍历每一个？， 给每一个？赋值， 值来源于可变参数的数组： 
		if(count > 0){
			// 增强健壮性; 
			if(params == null){
				throw new RuntimeException("必须传递参数的值");
			}
			if(params.length != count){
				
				throw new RuntimeException("传递的参数个数不正确");
			}
			
			for(int i =0 ;i<count; i++){
				pstmt.setObject(i+1, params[i]); 
			}
		}
		
		//执行增删改
		int num = pstmt.executeUpdate();
		//释放资源 
		//DB.release(null, pstmt, connection);
		
		return num;
	}
	
	
	
	/*
	 * 封装4：查询
	 * param1：sql语句
	 * param2：参数序列
	 * 返回结果集
	 */
	public ResultSet query (String sql,Object ... params){
		Connection conn = null; 
		PreparedStatement pstmt = null; 
		ResultSet rs = null; 
		
		try {
			conn = DB.getConnection(); 
			pstmt = conn.prepareStatement(sql); 
			
			// 给占位符赋值：  
			ParameterMetaData pmd = pstmt.getParameterMetaData();
			int count = pmd.getParameterCount();
			if(count > 0){
				// 增强健壮性; 
				if(params == null){
					throw new RuntimeException("必须传递参数的值");
				}
				if(params.length != count){
					
					throw new RuntimeException("传递的参数个数不正确");
				}
				
				for(int i =0 ;i<count; i++){
					pstmt.setObject(i+1, params[i]); 
				}
			}
			
			//执行; 
			rs = pstmt.executeQuery();
			return rs;
		} catch (SQLException e) {
			throw new RuntimeException(e); 
		}finally{
			//DB.release(rs, pstmt, conn); 
		}
	}
	
	
}



